From 21cd08530e5177f375f1147e23ec3b07e3264020 Mon Sep 17 00:00:00 2001 From: "bd240@boulderdash.cl.cam.ac.uk" Date: Tue, 28 Jan 2003 18:06:51 +0000 Subject: [PATCH] bitkeeper revision 1.20 (3e36c6bbUkBKPUFHEdbVYjpf-mrJ-w) --- xen-2.4.16/common/domain.c | 24 +++++++++++++++++-- xen-2.4.16/common/memory.c | 6 ++++- .../include/hypervisor-ifs/hypervisor-if.h | 1 + .../arch/xeno/drivers/dom0/dom0_core.c | 8 +++++++ .../arch/xeno/drivers/dom0/dom0_memory.c | 2 ++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/xen-2.4.16/common/domain.c b/xen-2.4.16/common/domain.c index 80b157ce78..8fd666ae5c 100644 --- a/xen-2.4.16/common/domain.c +++ b/xen-2.4.16/common/domain.c @@ -563,10 +563,12 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) unsigned long phys_l1tab, phys_l2tab; unsigned long cur_address, alloc_address; unsigned long virt_load_address, virt_stack_address, virt_shinfo_address; + unsigned long virt_ftable_start, virt_ftable_end, ft_mapping; start_info_t *virt_startinfo_address; unsigned long long time; unsigned long count; unsigned long alloc_index; + unsigned long ft_pages; l2_pgentry_t *l2tab, *l2start; l1_pgentry_t *l1tab = NULL; struct pfn_info *page = NULL; @@ -620,10 +622,12 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) p->mm.pagetable = mk_pagetable(phys_l2tab); /* - * NB. The upper limit on this loop does one extra page. This is to - * make sure a pte exists when we want to map the shared_info struct. + * NB. The upper limit on this loop does one extra page + pages for frame table. + * This is to make sure a pte exists when we want to map the shared_info struct + * and frame table struct. */ + ft_pages = (frame_table_size + (PAGE_SIZE - 1)) << PAGE_SHIFT; l2tab += l2_table_offset(virt_load_address); cur_address = p->pg_head << PAGE_SHIFT; for ( count = 0; @@ -681,6 +685,21 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) (virt_load_address + ((alloc_index - 1) << PAGE_SHIFT)); virt_stack_address = (unsigned long)virt_startinfo_address; + /* set up frame_table mapping */ + ft_mapping = (unsigned long)frame_table; + virt_ftable_start = virt_shinfo_address + PAGE_SIZE; + virt_ftable_end = virt_ftable_start + frame_table_size; + for(cur_address = virt_ftable_start; + cur_address < virt_ftable_end; + cur_address += PAGE_SIZE){ + l2tab = l2start + l2_table_offset(cur_address); + l1tab = map_domain_mem(l2_pgentry_to_phys(*l2tab)); + l1tab += l1_table_offset(cur_address); + *l1tab = mk_l1_pgentry(__pa(ft_mapping)|L1_PROT); + unmap_domain_mem(l1tab); + ft_mapping += PAGE_SIZE; + } + unmap_domain_mem(l2start); /* Install the new page tables. */ @@ -701,6 +720,7 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params) virt_startinfo_address->pt_base = virt_load_address + ((p->tot_pages - 1) << PAGE_SHIFT); virt_startinfo_address->phys_base = p->pg_head << PAGE_SHIFT; + virt_startinfo_address->frame_table = virt_ftable_start; /* Add virtual network interfaces and point to them in startinfo. */ while (params->num_vifs-- > 0) { diff --git a/xen-2.4.16/common/memory.c b/xen-2.4.16/common/memory.c index cd7381ff7b..4aa9c085d6 100644 --- a/xen-2.4.16/common/memory.c +++ b/xen-2.4.16/common/memory.c @@ -826,7 +826,11 @@ int do_process_page_updates_bh(page_update_request_t * cur, int count) int do_process_page_updates(page_update_request_t *updates, int count) { page_update_request_t * pg_updates; + int ret; pg_updates = do_process_page_updates_uh(updates, count); - return do_process_page_updates_bh(pg_updates, count); + ret = do_process_page_updates_bh(pg_updates, count); + kfree(pg_updates); + + return ret; } diff --git a/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h b/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h index cde1fced95..9038d51d11 100644 --- a/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h +++ b/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h @@ -200,6 +200,7 @@ typedef struct start_info_st { net_ring_t *net_rings; int num_net_rings; blk_ring_t *blk_ring; /* block io communication rings */ + unsigned long frame_table; unsigned char cmd_line[1]; /* variable-length */ } start_info_t; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c index fa3008dd9a..d9c33da283 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c @@ -40,6 +40,8 @@ #define DOM_DIR "dom" #define DOM_MEM "mem" +frame_table_t * frame_table; + static struct proc_dir_entry *xeno_base; static struct proc_dir_entry *dom0_cmd_intf; static struct proc_dir_entry *proc_ft; @@ -102,7 +104,11 @@ static ssize_t dom_mem_read(struct file * file, char * buff, size_t size, loff_t /* remap the range using xen specific routines */ + printk(KERN_ALERT "bd240 debug: dmw entered %lx, %lx\n", mem_data->pfn, mem_data->tot_pages); + addr = direct_mmap(mem_data->pfn << PAGE_SHIFT, mem_data->tot_pages << PAGE_SHIFT, prot, 0, 0); + + printk(KERN_ALERT "bd240 debug: dmw exit %lx, %lx\n", mem_data->pfn, mem_data->tot_pages); copy_to_user((unsigned long *)buff, &addr, sizeof(addr)); @@ -236,6 +242,8 @@ out: static int __init init_module(void) { + frame_table = (frame_table_t *)start_info.frame_table; + /* xeno proc root setup */ xeno_base = proc_mkdir(XENO_BASE, &proc_root); diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c index 1f62cbda7c..46b44deef3 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c @@ -187,8 +187,10 @@ unsigned long direct_mmap(unsigned long phys_addr, unsigned long size, /* and perform the mapping */ if(flag == MAP_DISCONT){ + printk(KERN_ALERT "bd240 debug: call direct_remap_disc_page_range\n"); ret = direct_remap_disc_page_range(addr, phys_addr, tot_pages, prot); } else { + printk(KERN_ALERT "bd240 debug: call direct_remap_page_range\n"); ret = direct_remap_page_range(addr, phys_addr, size, prot); } -- 2.30.2